//@author wtfumlomglol
package amm.Graphic;

import java.io.*;
import java.util.*;

//osztaly a civil kozlekedok leirasahoz
public class Citizen extends Vehicle {

    protected CitizenType type = CitizenType.LAMBORGHINI;
    //a jatek megszakitasahoz
    protected Game g;
    //azt mutatja, meg hany kort kell a stoptablanal varni
    protected int stopCount = 0;
    //naplózó objektum események kezelésére
    protected Logger logger;

    public Citizen() {
    }

    public Citizen(Game game, int index) {
        this.g = game;
        logger = g.getLogger();
        name = "Citizen[" + index + "]";
    }

    //akkor hivodik meg, ha bankrablo lepett arra a mezore, amin all.
    @Override
    public void visit(Criminal cr) {
        logger.addMessage("Criminal crashed with " + name);
        g.wasted();
        g.returnToMenu();
    }

    //akkor hivodik meg, ha civil lep arra a mezore, amin all
    //a jelenlegi specifikacio szerint ez nem lehetseges
    @Override
    public void visit(Citizen cz) {
        logger.addMessage("***COLLISION WITH CITIZEN***");
    }

    //akkor hivodik meg, ha egy rendor kutatja a mezot, amin all
    @Override
    public void visit(Police p) {
    }

    //kodolasi okokbol kerult ide ez a metodus. Civilt nem lehet
    //leallitani bizonytalan idore.
    @Override
    public void forceStop() {
    }

    //egy korben egyszer lefut az alabbi kod
    public void onTick() {
        tempo--;
        if (tempo == 0) {
            if (stopCount == 0) {
                occupies.leave(true, null);
            } else {
                stopCount--;
                logger.addMessage(name + " didn't move.");
            }
            switch (type) {
                case LAMBORGHINI:
                    tempo = 1;
                    break;
                case VOLKSWAGEN:
                    tempo = 2;
                    break;
                case TRABANT:
                    tempo = 3;
                    break;
            }
        }
    }

    //az aktuális mezo hivja meg ezt a metodust, hogy atmozditsa
    //a kovetkezore; ha a sajat referenciajat adja meg, a civl
    //nem mozdul
    public void moveTo(Field f) {
        //elmenti az aktualis mezo referenciajat
        Field prev = occupies;
        //ha masik mezot kap
        if (prev != f) {
            //at irja a sajat mezojet az ujra
            occupies = f;
            boolean sign;
            Place place;
            logger.addMessage(name + " moved to " + occupies.getName());
            //ha az elozo mezo letezett [csak inicializacio eseten nem]
            if (prev != null) {
                //felszabaditja az elozo mezot
                prev.clear();
            }
            //lekerdezi az uj mezotol a tipusat
            place = occupies.getPlace();
            //ha ut, lekerdezi, van-e rajta stoptabla
            if (place == Place.ROAD) {
                Road rd = (Road) occupies;
                sign = rd.getSign();
                //ha van, noveli a varakozasi ido erteket
                if (sign) {
                    stopCount = 1;
                }
            }
        } //ha az uj mezo egyezik a regivel, nem mozdul
        else {
            logger.addMessage(name + " didn't move.");
        }
    }

    public CitizenType getType() {
        return this.type;
    }

    public void setType(CitizenType ct) {
        this.type = ct;
        switch (ct) {
            case LAMBORGHINI:
                tempo = 1;
                break;
            case VOLKSWAGEN:
                tempo = 2;
                break;
            case TRABANT:
                tempo = 3;
                break;
        }
    }

    //térképhez szolgáltat rajzjelet
    @Override
    public String getMark() {
        switch (type) {
            case LAMBORGHINI:
                return "L";
            case VOLKSWAGEN:
                return "V";
            case TRABANT:
                return "T";
            default:
                return "Z";
        }
    }

    public String getName() {
        return name;
    }
}

